import { Ref, computed, ref } from 'vue';

// 快递公司
export const getPlatformList = (): string[] => [
  '其他快递',
  '邮政快递',
  '顺丰快递',
  '中通快递',
  '圆通快递',
  '韵达快递',
  '菜鸟快递',
  '京东快递',
  '天猫快递',
  '淘宝快递'
];

export interface OptionsStateData {
  [propName: string]: OptionsStateList[];
}

export interface OptionsStateList {
  label: string;
  value: string;
  tagConfig?: {
    type?: string;
    color?: string;
    effect?: string;
    round?: string;
  };
}

/**
 * 获取默认状态
 *
 * @param scene 场景如：role, user, order
 *
 * @todo 根据scene返回对应状态options
 * @todo 不传则返回全部options
 */
export const GetStateOptionsAll = (): OptionsStateData => ({
  'permission-type': [
    {
      label: '菜单',
      value: '1'
    },
    {
      label: '功能',
      value: '2',
      tagConfig: {
        type: 'success'
      }
    }
  ],
  role: [
    {
      label: '超级管理员',
      value: 'super',
      tagConfig: {
        type: 'danger'
      }
    },
    {
      label: '管理员',
      value: 'admin',
      tagConfig: {
        type: ''
      }
    },
    {
      label: '财务账号',
      value: 'finance',
      tagConfig: {
        type: 'success'
      }
    },
    {
      label: '库管账号',
      value: 'inventory',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '员工账号',
      value: 'worker',
      tagConfig: {
        type: 'warning'
      }
    }
  ],
  user: [
    {
      label: '锁定',
      value: '0',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '正常',
      value: '1',
      tagConfig: {
        type: 'success'
      }
    }
  ],
  // 收益状态
  income: [
    {
      label: '待结算',
      value: '1'
    },
    {
      label: '已结算',
      value: '2',
      tagConfig: {
        type: 'success'
      }
    },
    {
      label: '已回收',
      value: '9',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 收益类型
  'income-type': [
    {
      label: '佣金',
      value: '1'
    },
    {
      label: '积分',
      value: '2',
      tagConfig: {
        type: 'warning'
      }
    }
  ],
  // 充值类型
  'recharge-type': [
    {
      label: '佣金',
      value: '1'
    },
    {
      label: '积分',
      value: '2',
      tagConfig: {
        type: 'warning'
      }
    }
  ],
  // 提现状态
  capital: [
    {
      label: '待审核',
      value: '1'
    },
    {
      label: '待入账',
      value: '2'
    },
    {
      label: '提现成功',
      value: '3',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '提现失败',
      value: '4',
      tagConfig: {
        type: 'danger'
      }
    },
    {
      label: '已拒绝',
      value: '9',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 提现类型
  'capital-type': [
    {
      label: '微信钱包',
      value: '1',
      tagConfig: {
        type: 'success'
      }
    },
    {
      label: '支付宝钱包',
      value: '2'
    },
    {
      label: '银行卡',
      value: '3'
    },
    {
      label: '线下转账',
      value: '4',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 订单状态
  order: [
    {
      label: '待支付',
      value: '1'
    },
    {
      label: '待发货',
      value: '2'
    },
    {
      label: '待签收',
      value: '3'
    },
    {
      label: '待结算',
      value: '4'
    },
    {
      label: '已完成',
      value: '5',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '已取消',
      value: '9',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 订单类型：1-销售订单，2-积分订单
  'order-type': [
    {
      label: '销售订单',
      value: '1'
    },
    {
      label: '积分订单',
      value: '2',
      tagConfig: {
        type: 'warning'
      }
    }
  ],
  // 订单类型-支付方式：1-积分支付，2-佣金支付，3-微信支付，4-支付宝，5-银行卡
  'order-type-pay': [
    {
      label: '积分支付',
      value: '1',
      tagConfig: {
        type: 'warning'
      }
    },
    {
      label: '佣金支付',
      value: '2'
    },
    {
      label: '微信支付',
      value: '3',
      tagConfig: {
        type: 'success'
      }
    },
    {
      label: '支付宝',
      value: '4'
    },
    {
      label: '银行卡',
      value: '5'
    },
    {
      label: '后台支付',
      value: '6',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 订单类型-下单应用平台：1-小程序，2-Web，3-APP
  'order-type-apply': [
    {
      label: '小程序',
      value: '1'
    },
    {
      label: 'Web',
      value: '2'
    },
    {
      label: 'APP',
      value: '3'
    }
  ],
  // 状态-售后：1-已申请，2-已同意，3-已回寄，4-已处理，5-已完成，9-已拒绝
  appeal: [
    {
      label: '待处理',
      value: '1'
    },
    {
      label: '待回寄',
      value: '2'
    },
    {
      label: '待确认',
      value: '3'
    },
    {
      label: '待处理',
      value: '4'
    },
    {
      label: '已完成',
      value: '5',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '已拒绝',
      value: '9',
      tagConfig: {
        type: 'info'
      }
    }
  ],
  // 订单类型-售后方式：1-换货，2-退货
  'appeal-type-appeal': [
    {
      label: '换货',
      value: '1'
    },
    {
      label: '退货',
      value: '2'
    }
  ],
  // 商品类型
  'goods-type': [
    {
      label: '普通商品',
      value: '1'
    },
    {
      label: '积分商品',
      value: '2',
      tagConfig: {
        type: 'warning'
      }
    }
  ],
  // 广告图类型
  'banner-type': [
    {
      label: '商品广告',
      value: '1'
    },
    {
      label: '分类广告',
      value: '2'
    },
    {
      label: '文章广告',
      value: '3'
    },
    {
      label: '外链广告',
      value: '4'
    }
  ],
  // 公告-状态，0-下架、1-投放
  notify: [
    {
      label: '下架',
      value: '0',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '投放',
      value: '1',
      tagConfig: {
        type: 'success'
      }
    }
  ],
  // 公告-状态-弹窗：0-否，1-是
  'notify-alert': [
    {
      label: '否',
      value: '0',
      tagConfig: {
        type: 'info'
      }
    },
    {
      label: '是',
      value: '1',
      tagConfig: {
        type: 'success'
      }
    }
  ]
});

// 获取状态
export const GetStateOptions = (scene: keyof OptionsStateData) => {
  const stateOptsAll = GetStateOptionsAll();
  if (typeof stateOptsAll[scene] === 'undefined') {
    console.error(`GetStateOptions：未设置${scene}场景值`);
    return [];
  }
  return stateOptsAll[scene];
};

/**
 * 根据场景、状态值，获取描述
 *
 * 注：建议直接使用标签<PipeStateTags type="" state="" />
 *
 * @param scene 场景
 * @param value 状态值
 * @returns
 */
export const GetLabelByStateOptions = (
  scene: keyof OptionsStateData,
  value: string
) => {
  const stateData = GetStateOptions(scene);
  const itemData = stateData.find((item) => item.value === value);
  return itemData?.label || '';
};

// 抽屉默认数据
export interface DrawerOpts<T = {}> {
  title?: string;
  visible?: boolean;
  data?: T;
  size?: string;
  isView?: boolean;
  isEdit?: boolean;
  complete?: (args: DrawerCompleteSchema) => void;
}

/**
 * 抽屉默认数据
 *
 * @param opts 默认数据
 * @returns
 */
export const InitDrawerOpts = <T = {}>(opts?: DrawerOpts<T>) => ({
  title: opts?.title || '',
  visible: opts?.visible || false,
  data: opts?.data || ({} as T),
  size: opts?.size || '64%',
  isView: opts?.isView || false,
  isEdit: opts?.isEdit || false,
  complete: () => {}
});

/**
 * [抽屉|弹窗]关闭后的回调参数
 */
interface DrawerCompleteSchema<T = any> {
  action: 'submit' | 'cancel' | 'close';
  result: T;
}

/**
 * 创建一个等待函数，且改变complete的回调函数
 * 用于抽屉、弹窗
 *
 * @param dialogOptions
 * @returns
 */
export const transformPromise = <T>(
  dialogOptions: DrawerOpts
): Promise<DrawerCompleteSchema<T>> =>
  new Promise((resolve) => {
    dialogOptions.complete = (args) => {
      resolve(args);
    };
  });

// 分页数据
export interface PageOpts {
  page?: number;
  size?: number;
  sizes?: number[];
  total?: number;
  layout?: string;
}

/**
 * 分页默认数据
 *
 * @param opts 默认数据
 * @returns
 */
export const InitPageOpts = (opts?: PageOpts) => ({
  page: ref(opts?.page || 1),
  size: ref(opts?.size || 10),
  sizes: ref(opts?.sizes || [10, 20, 50, 100]),
  total: ref(opts?.total || 0),
  layout: ref(opts?.layout || 'total, sizes, prev, pager, next, jumper')
});

interface LoadOpts {
  refresh?: boolean;
  submit?: boolean;
}

/**
 * 初始化loadOpts，请求：loadOpts.refresh，提交：loadOpts.submit
 * @param opts
 * @returns
 */
export const InitLoadOpts = (opts?: LoadOpts) => ({
  refresh: opts?.refresh ?? false,
  submit: opts?.submit ?? false
});

/**
 * 计算当前列表序号起始index
 *
 * @param {Ref} page
 * @param {Ref} size
 * @returns
 */
export const InitTableIndex = (page: Ref<number>, size: Ref<number>) =>
  computed(() => (page.value - 1) * size.value + 1);
// export const InitTableIndex = (page: number, size: number) => computed(() => (page - 1) * size + 1);
